
#include <iostream>
#include <memory>


/* shared_ptr通过引用计数，析构释放内存空间，实现对内存的动态管理
 * 1. 一块空间可以由多个shared_ptr管理,通过引用计数的方式进行管理，直到引用计数为0才会删除掉该对象
 * 2. 一个shared_ptr可以管理一块空间,当一个shared_ptr指向新的对象时，原来的对象的所有的shared_ptr 的引用数减1
 * 3. shared_ptr可能会有循环引用问题，循环引用问题可以通过weak_ptr解决
 * 4. 普通指针不能直接赋值给shared_ptr
 */

/* 野指针是指指针指向的内存空间已经被释放，此时这个指针被称为野指针,或者定义的指针没有初始化
*/
using namespace std;


int main(int argc, char *argv[])
{

    shared_ptr<int> p1(new int(10));
    int *p2 = p1.get();

    shared_ptr<int> p3 = p1;
    shared_ptr<int> p4(p1);

    printf("Value: %d %d \n",*p1.get(),*p2);
    printf("Addr: %p %p \n",p1.get(),p2);
    printf("p1.count: %ld \n",p1.use_count());

    // p3.reset();
    printf("Value: %d %d \n",*p4.get(),*p2);
    printf("Addr: %p %p \n",p4.get(),p2);
    printf("p1.count: %ld \n",p4.use_count());

    shared_ptr<int> p5(new int(88));

    shared_ptr<int> p6 = p5;
    // p4.swap(p5); // 支持所有权的转移
    p4 = p5;
    
    printf("p1.count: %ld p3.count: %ld \n",p4.use_count(),p3.use_count());
    printf("value p4: %d \n",*p4.get());
    return 0;

}